package org.indexador.util.sax;

import java.sql.*;
import java.text.*;
import java.util.*;
import java.util.Date;

import org.wikipedia.entidades.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class ManipuladorSax extends DefaultHandler {
  private Collection<TextoWikipedia> lista = new ArrayList<TextoWikipedia>();
  private TextoWikipedia texto = new TextoWikipedia();
  private String atributo = "";
  private long inicio;
  private long fim;
  private int quantidade;

  public void startElement(String uri, String localName, String qName,
      Attributes atributos) throws SAXException {
    atributo = qName;
    if (qName.equals("page")) {
      inicio = System.currentTimeMillis();
      texto = new TextoWikipedia();
    }
  }

  @Override
  public void endElement(String uri, String localName, String qName)
      throws SAXException {
    if (qName.equals("page")) {
      lista.add(new TextoWikipedia());
      //      if (lista.size() % 200 == 0) {
      quantidade++;
      if (quantidade == 1000) {
        return;
      }
      if (quantidade % 100 == 0) {
        fim = System.currentTimeMillis();
        System.out.printf("%d registros em %dms\n", quantidade, (fim - inicio));
      }
    }
  }

  @Override
  public void characters(char[] ch, int start, int length) throws SAXException {
    super.characters(ch, start, length);
    //
    System.out.println("Caracteres\n" + new String(ch));
    //
    String valor = String.valueOf(ch, start, length);
    if (valor.trim().length() == 0) return;
    //
    if (atributo.equals("sitename")) {
      texto.setSiteName(valor);
    }
    if (atributo.equals("username")) {
      texto.setUserName(valor);
    } else if (atributo.equals("timestamp")) {
      SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss'Z'");
      try {
        Date time = format.parse(valor);
        Timestamp timeStamp = new Timestamp(time.getTime());
        texto.setTimeStamp(timeStamp);
      } catch (ParseException e) {
        e.printStackTrace();
      }
    } else if (atributo.equals("title")) {
      texto.setTitle(valor);
    } else if (atributo.equals("text")) {
      StringBuilder buffer = new StringBuilder();
      if (texto.getText() != null) {
        buffer.append(texto.getText());
      }
      buffer.append(valor);
      texto.setText(buffer.toString());
    }
  }

  public Collection<TextoWikipedia> getLista() {
    return lista;
  }
}
